Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Probestudium / 2013 / WS I: 3D-Programmierung / Arbeitsgruppen 2013 / Nepo&Daniel / Mensch ärger dich nicht.py


Inhaltsbereich

Mensch ärger dich nicht.py

Python Source icon Mensch ärger dich nicht.py — Python Source, 12 KB (12871 bytes)

Dateiinhalt

#Achtung Figuren schlagen hat Bugs

from visual import *
from threading import Thread
scene.range = 15 # fixed size, no autoscaling
'''scene.stereo="redcyan"'''
PORT = 51540
class feldinhalt(frame):
    def __init__(self,nummer,farbe):
        frame.__init__(self)
        self.feldinhalt=ring(frame=self,pos=(0,0,0),radius=0.5,color=farbe,axis=(0,1,0),material=materials.diffuse)
        self.nummer=nummer
class spielfigur(frame):
    def __init__(self,nummer,farbe):
        frame.__init__(self)
        self.koerper=cylinder(frame=self,pos=(0,0,0),radius=0.45,color=farbe,axis=(0,1.5,0),material=materials.chrome)
        self.Kopf=cone(frame=self,pos=(0,1.5,0),axis=(0,1,0),radius=0.45,color=farbe,material=materials.chrome)
        self.nummer=nummer
        self.ringnr = 0
        self.anfangspos=self.pos
class spielfeld(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.aufbauen()
    def aufbauen(self):    
        feld=box(pos=(0,0,0),length=22,height=0.05,width=22,color=(1.5,1.5,1.5),material=materials.wood)
        #Ringe
        self.ringliste=[]
        self.figurenliste=[]
        for i in range(-20,0):
            self.s1= feldinhalt(i,farbe=color.red)
            self.s2= feldinhalt(i+20,farbe=color.red)
            self.s3= feldinhalt(i+40,farbe=color.red)
            self.s4= feldinhalt(i+60,farbe=color.red)
            self.s1.pos=(10+i,0.1,-10)
            self.s2.pos=(10,0.1,10+i)
            self.s3.pos=(10+i,0.1,10)
            self.s4.pos=(-10,0.1,10+i)
            self.ringliste.append(self.s1)
            self.ringliste.append(self.s2)
            self.ringliste.append(self.s3)
            self.ringliste.append(self.s4)
        for u in range(0,2):
            self.s5=feldinhalt(-u-405,farbe=color.black)
            self.s5.pos=(7+u,0.1,7)
            self.s6=feldinhalt(-u-408,farbe=color.black)
            self.s6.pos=(7+u,0.1,8) 
            self.s7=feldinhalt(-u-411,farbe=color.green)
            self.s7.pos=(-8+u,0.1,-7)
            self.s8=feldinhalt(-u-414,farbe=color.green)
            self.s8.pos=(-8+u,0.1,-8)    
            self.s9=feldinhalt(u+405,farbe=color.blue)
            self.s9.pos=(-8+u,0.1,7)
            self.s10=feldinhalt(u+408,farbe=color.blue)
            self.s10.pos=(-8+u,0.1,8)
            self.s11=feldinhalt(u+411,farbe=color.orange)
            self.s11.pos=(7+u,0.1,-7)
            self.s12=feldinhalt(u+414,farbe=color.orange)
            self.s12.pos=(7+u,0.1,-8)
            self.ringliste.append(self.s5)
            self.ringliste.append(self.s6)
            self.ringliste.append(self.s7)
            self.ringliste.append(self.s8)
            self.ringliste.append(self.s9)
            self.ringliste.append(self.s10)
            self.ringliste.append(self.s11)
            self.ringliste.append(self.s12)
        for o in range(-9,-5):
            self.d1=feldinhalt(o+1000,farbe=color.blue)
            self.d1.pos=(o,0.1,0)
            self.d2=feldinhalt(-o+1500,farbe=color.green)
            self.d2.pos=(0,0.1,o)
            self.ringliste.append(self.d1)
            self.ringliste.append(self.d2)
        for p in range(6,10):
            self.d3=feldinhalt(-p+2000,farbe=color.orange)
            self.d3.pos=(p,0.1,0)
            self.d4=feldinhalt(p+2500,farbe=color.black)
            self.d4.pos=(0,0.1,p)
            self.ringliste.append(self.d3)
            self.ringliste.append(self.d4)
        for l in range(0,1):
            self.w1= feldinhalt(-l+3000,farbe=color.orange)
            self.w2= feldinhalt(-l+3500,farbe=color.green)
            self.w3= feldinhalt(l+4000,farbe=color.black)
            self.w4= feldinhalt(l+4500,farbe=color.blue)
            self.w1.pos=(10+l,0.1,-10)
            self.w2.pos=(-10,0.1,-10+l)
            self.w3.pos=(10+l,0.1,10)
            self.w4.pos=(-10,0.1,10+l)
            self.ringliste.append(self.w1)
            self.ringliste.append(self.w2)
            self.ringliste.append(self.w3)
            self.ringliste.append(self.w4)         
        ###Figuren
            
        for i in range(0,1):
            self.r1 = spielfigur(1,farbe=color.green)
            self.r2 = spielfigur(2,farbe=color.green)
            self.r3 = spielfigur(3,farbe=color.green)
            self.r4 = spielfigur(4,farbe=color.green)
            self.r1.anfangspos=self.r1.pos=(-8+i,0.05,-7)
            self.r2.anfangspos=self.r2.pos=(-8+i,0.05,-8)
            self.r3.anfangspos=self.r3.pos=(-7+i,0.05,-7)
            self.r4.anfangspos=self.r4.pos=(-7+i,0.05,-8)
            self.r5 = spielfigur(5,farbe=color.black)
            self.r6 = spielfigur(6,farbe=color.black)
            self.r7 = spielfigur(7,farbe=color.black)
            self.r8 = spielfigur(8,farbe=color.black)
            self.r5.anfangspos=self.r5.pos=(7+i,0.05,7)
            self.r6.anfangspos=self.r6.pos=(7+i,0.05,8)
            self.r7.anfangspos=self.r7.pos=(8+i,0.05,7)
            self.r8.anfangspos=self.r8.pos=(8+i,0.05,8)
            self.r9 = spielfigur(9,farbe=color.blue)
            self.r10 = spielfigur(10,farbe=color.blue)
            self.r11 = spielfigur(11,farbe=color.blue)
            self.r12 = spielfigur(12,farbe=color.blue)
            self.r9.anfangspos=self.r9.pos=(-8+i,0.05,7)
            self.r10.anfangspos=self.r10.pos=(-8+i,0.05,8)
            self.r11.anfangspos=self.r11.pos=(-7+i,0.05,7)
            self.r12.anfangspos=self.r12.pos=(-7+i,0.05,8)
            self.r13 = spielfigur(13,farbe=color.orange)
            self.r14 = spielfigur(14,farbe=color.orange)
            self.r15 = spielfigur(15,farbe=color.orange)
            self.r16 = spielfigur(16,farbe=color.orange)
            self.r13.anfangspos=self.r13.pos=(7+i,0.05,-7)
            self.r14.anfangspos=self.r14.pos=(7+i,0.05,-8)
            self.r15.anfangspos=self.r15.pos=(8+i,0.05,-7)
            self.r16.anfangspos=self.r16.pos=(8+i,0.05,-8)
            self.figurenliste.append(self.r1)
            self.figurenliste.append(self.r2)
            self.figurenliste.append(self.r3)
            self.figurenliste.append(self.r4)
            self.figurenliste.append(self.r5)
            self.figurenliste.append(self.r6)
            self.figurenliste.append(self.r7)
            self.figurenliste.append(self.r8)
            self.figurenliste.append(self.r9)
            self.figurenliste.append(self.r10)
            self.figurenliste.append(self.r11)
            self.figurenliste.append(self.r12)
            self.figurenliste.append(self.r13)
            self.figurenliste.append(self.r14)
            self.figurenliste.append(self.r15)
            self.figurenliste.append(self.r16)

    def figur_setzen(self,figurnr,zielnr):
        for f in self.figurenliste:
            if f.nummer==figurnr:
                figur=f
                break
        for ring in self.ringliste:
            if ring.nummer==zielnr:
                figur.pos=ring.pos
                figur.ringnr=ring.nummer
                break
    
    def run(self):
        figurnr = -1 #die figurnummer
        zielnr = -1 #die zielposition (als nummer)
        pick = None # no object picked out of the scene yet
        while True:
            rate(30)  
            if scene.mouse.events:
                m1 = scene.mouse.getevent() # get event
                if m1.drag and m1.pick:
                    for f in self.figurenliste:
                        if m1.pick in f.objects:
                            figurnr=f.nummer
                            altpos=m1.pickpos-(m1.pickpos-f.pos)
                            break
                        else:
                             f = None
                    drag_pos =m1.pickpos
                    drag_pos.y = 0
                    pick = f    
                elif m1.drop and pick: # released at end of drag
                    for ring in self.ringliste:
                        ringmitte = ring.pos
                        if mag(ringmitte-pick.pos) < .5:
                            f.pos = ringmitte
                            zielnr=ring.nummer
                            pick=None
                            for g in self.figurenliste:
                                if g.pos==f.pos:
                                    g.pos=g.anfangspos
                                    break
                            zufall=int(random.random()*6+1)
                            augen=label(text=str(zufall),pos=(0,0,0),depth=-0.3,color=color.cyan)
                            break
                    if not f.pos in [ring.pos for ring in self.ringliste]:
                        f.pos=altpos
                        pick=None
                            
                     #--------------------#
                    self.controller.weiterleiten(str(figurnr)+","+str(zielnr))
                     #--------------------#
                    #self.figur_setzen(figurnr,zielnr)
                    pick = None    
            if pick:
                # project onto xy plane, even if scene rotated:
                new_pos = scene.mouse.project(normal=(0,1,0))
                if new_pos != drag_pos :# if mouse has moved
                    pick.pos += new_pos - drag_pos
                    drag_pos = new_pos # update drag position+
                    
               
                    pick.pos = new_pos + pick.pos - drag_pos
                    drag_pos = new_pos # update drag position            
                    # offset for where the ball was clicked:

zufall=int(random.random()*6+1)
augen=label(text=str(zufall),pos=(0,0,0),depth=-0.3,color=color.cyan)
      
'''Diese Klasse ermoeglicht die Netzkommunikation. Bau sie in dein Projekt ein.
Die eigentliche Spielklasse braucht ein Referenzattribut auf ein Objekt dieser Steuerungs-Klasse,
und kann dann mittels der Steuerungs-Methode weiterleiten(nachricht) einen String an die
Steuerung schicken, die ihrerseits das an den Server weiterleitet. (Was der Server macht, steht
in der Datei "server_class.py", die sich im selben Verzeichnis befinden muss.)
Der Konstruktor verlangt ein Objekt, dem er die Nachrichten des Servers schicken soll, also das
eigentliche Spiel, und optional einen Port. Jedes Team sollte eine eigene fuenstellige Portnummer
waehlen.'''

class Steuerung(Thread):
    def __init__(self, spiel, port=51540):
        Thread.__init__(self)
        self.view=spiel
        # UDP-Client, der den Server als Subprozess startet
        import subprocess                                       # Modul zum Starten von Subprozessen
        import socket 	        	                        # Modul fuer Netzwerkkommunikation
        self.PORT = port
        #Anlegen eines Socket
        self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    # AF_INET = IPv4, SOCK_DGRAM = UDP
        self.s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)   # Broadcast ermoeglichen
        #Testen, ob es schon einen Server auf diesem Port gibt, notfalls selber starten
        try:
            self.s.sendto("print 'wer hoert mich?'",
                     ('255.255.255.255', self.PORT))                 # sende Nachricht 'an alle'
            self.s.settimeout(2)                                    # warte 1/2 Sekunde..
            print (self.s.recvfrom(64)[0])                             # gibt Servermeldung aus
            #ein Problem, wenn timeout einmal gesetzt ist...
            self.s.settimeout(3000)
        except:                                                 # reagiert auf Zeitueberschreitung
            print ("Kein Server vorhanden - starte Server")       # Rueckmeldung
            subprocess.Popen(['python','server_class.py',str(self.PORT)])  # Server starten
            self.s.setblocking(1)                                    # nicht-blockierend
            self.s.sendto("print 'hallo'", ('255.255.255.255', self.PORT))
        self.start()
    #Endlosmethode zum Abhoeren des Ports auf Nachrichten
    def run(self):
        while True:
            nachricht = self.s.recvfrom(128)[0]
            self.auswerten(nachricht)
    #Methode zum Auswerten der eingegangenen Nachricht
    def auswerten(self,nachricht):
        exec (nachricht)

    #Methode zum Weiterleiten, wird von Spiel genutzt
    def weiterleiten(self, nachricht):
	# HIER CODE EINFUEGEN, DER AUSGEFUEHRT WERDEN SOLL
        teile=nachricht.split(",")
        nachricht = "self.view.figur_setzen("+teile[0]+","+teile[1]+")"
        self.s.sendto(nachricht, ('255.255.255.255', self.PORT))      # versenden der Nachricht an Tupel(IP, PORT)

if __name__ == "__main__":
    spiel = spielfeld()                #das eigentliche Spiel
    steuerung = Steuerung(spiel, PORT)  #Die Steuerung, mit dem Spiel und einem Port als Argument
    spiel.controller = steuerung        #Setzen des Referenzattributs
    spiel.run()                       #Das Spiel muss von Thread erben, hier wird dessen run-Methode gestartet





Funktionsleiste